home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / util / misc / RandPY.lha / RandPinYin / Original / randpy.c < prev    next >
C/C++ Source or Header  |  1991-06-21  |  4KB  |  177 lines

  1. /*
  2.          RANDPY  by  Huangxin Wang
  3.             Dept. of Phyics, University of Pennsylvania
  4.             wang@pennmess.physics.upenn.edu
  5.             June 20, 1991
  6.  
  7.     "randpy" randomly selects a Chinese character and display it
  8.     in Chinese as well as its pinyin.  You can learn to read 
  9.     correct Chinese pronunciation at your lunch time, or put
  10.     it in your .logout  to leave a Chinese character on the screen!
  11.     You will find out that there are so many Chinese characters that
  12.     you know the meaning but pronounce it wrong.
  13.  
  14.     To install:
  15.  
  16.         make randpy
  17.  
  18.     then put pinyin.hz in the directory defined by environment
  19.     variable HZDIR (used by "hzview").
  20.  
  21.     To run it, you  need the hzview program by Fung F. Lee
  22.     (available by anonymous ftp: ahkcus.org [192.55.187.25])
  23.  
  24.         randpy | hzview
  25.  
  26.             or
  27.  
  28.         randpy -b | hzview
  29.  
  30. Credit:
  31.     pinyin.hz table is edited by Ed Lai.  I prefer to use pinyin.hz
  32.     rather than pinyin.gb, since it is editable.
  33.  
  34.     hz->gb part is from Fung F. Lee's hanzi package.
  35. */
  36.  
  37. #include <stdio.h>
  38.  
  39. #define    PINYIN        "pinyin.hz"
  40. #define    HZDIR        "HZDIR"
  41. #define    PINYIN_NUMS    410    /* total number of pinyin items        */
  42. #define    TONE_NUMS    5    /* number of tones: from 1 to 5        */
  43. #define MAXINT  2147483647.0    /* 2**31 - 1 for the maximum of rand()  */
  44.                 /* for System V, MAXINT=32767=2**15-1   */
  45. #define    ASCII1        0xa3    /* ASCII Chinese font high byte        */
  46. #define    ASCII2        0xc1    /* ASCII Chinese font low byte for 'A'    */
  47. #define isTone(c) ((c)=='1' || (c)=='2' || (c)=='3' || (c)=='4' || (c)=='5')
  48.  
  49. char    py_tab[100];
  50. FILE    *pinyin;
  51. char    s[200], hz[200];
  52.  
  53. main(argc, argv)
  54. int    argc;
  55. char    *argv[];
  56. {
  57. int    rpy, rtone, i;
  58. int    c1, c2;
  59. int    big_ascii = 0;        /* flag for whether big font for ASCII    */
  60.  
  61.     srand((int)time(0L));    /* initialize the randomizer seed    */
  62.  
  63.     for (i=1; i<argc; i++) {
  64.         if (strcmp("-b", argv[i]) ==0)    big_ascii = 1;
  65.     }
  66.                 /* first, assume pinyin.hz is in current dir
  67.                  */
  68.     if ((pinyin = fopen(PINYIN, "r")) == NULL) {
  69.  
  70.        if (getenv(HZDIR) == NULL) {
  71.         fprintf(stderr, "Please setenv %s appropriately.\n",HZDIR);
  72.         exit (1);
  73.        }
  74.        strcpy(py_tab, getenv(HZDIR));
  75.        strcat(py_tab,"/");
  76.        strcat(py_tab,PINYIN);
  77.        if ((pinyin = fopen(py_tab, "r")) == NULL) {
  78.         fprintf(stderr,"Cannot open pinyin table %s\n", PINYIN);
  79.         exit(-1);
  80.        }
  81.     }
  82.                     /* read off the header lines    */
  83.                     /* first useful line is 'A,A,A"    */
  84.     do {
  85.         fgets(s, 200, pinyin);    /* fgets() get a string upto a <CR> */
  86.     } while (strcmp("A,A,A\n", s) != 0);    /* \n is needed    */
  87.  
  88.     /* get a random pinyin    */
  89.  
  90.     rpy = PINYIN_NUMS * (rand() / MAXINT) + 1;
  91.     rpy = (rpy > PINYIN_NUMS ? PINYIN_NUMS : rpy);
  92.     i = 0;
  93.     while (++i < rpy) {
  94.        do {
  95.         fgets(s, 200, pinyin);
  96.        } while (isTone(s[0]));
  97.     }
  98.  
  99.     /* Now we get the pinyin, choose a random tone    */
  100.  
  101.     rtone = TONE_NUMS * (rand() / MAXINT) + 1;
  102.     rtone = (rtone > TONE_NUMS ? TONE_NUMS : rtone);
  103. /* debugging:
  104.     fprintf(stderr, "PY = %d  tone = %d\n", rpy, rtone);
  105. */
  106.     for (i=0; i<rtone; i++) {
  107.         c1 = getc(pinyin);
  108.                     /* if this pinyin does not have that
  109.                        tone, then keep the last one */
  110.         ungetc(c1, pinyin);
  111.         if (isTone(c1)) fgets(hz, 200, pinyin);
  112.         else {
  113.             rtone = i;
  114.             break;
  115.         }
  116.     }
  117.  
  118.     /* get the number of characters in the list of same pinyin and tone */
  119.     /* Two chars in hz makes a chinese, the first three characters and
  120.        the last two should be exclude here is an example of the list:
  121.        1~{1_1`1^l.lTm>rysVv}~}
  122.     */
  123.  
  124.     i = (strlen(hz) - 5) /2;
  125.  
  126.     /* Now we get a random characters    */
  127.  
  128.     i = i * (rand() / MAXINT);
  129.  
  130.     /* Again 2 bytes as a chinese character, first 3 chars excluded */
  131.  
  132.     i = 3 + 2*i;
  133.     
  134.     /* Now print the Chinese character:    */
  135.  
  136.     gb2dos(hz[i], hz[i+1], &c1, &c2);
  137.     fputc(c1, stdout);
  138.     fputc(c2, stdout);
  139.  
  140.     if (!big_ascii) {
  141.  
  142.     /* Now print the pinyin and tone in small terminal character: */
  143.  
  144.     fprintf(stdout,"                             ");
  145.     for(i=0; s[i] != ','; i++) {
  146.         fputc(s[i], stdout);
  147.     }
  148.             /* label the tone, maybe different from rtone    */
  149.     fputc(hz[0], stdout);
  150.     }
  151.     else {
  152.     /* Now print the pinyin and tone in big Chinese font: */
  153.  
  154.     fputc('\n', stdout);
  155.     for(i=0; s[i] != ','; i++) {
  156.         fputc(ASCII1, stdout);
  157.         fputc(ASCII2+s[i]-'A', stdout);
  158.     }
  159.     fputc(ASCII1, stdout);
  160.     fputc(ASCII2+hz[0]-'A', stdout);
  161.     }
  162.     /* Now write the original PinYin, Wade-Gile, and Yale */
  163.     fprintf(stdout,"         %s",s);
  164.  
  165.     fclose(pinyin);
  166. }
  167. /*
  168.   hz2gb: convert a HZ file into a Macintosh/CCDOS GB file.  By  Fung F. Lee
  169. */
  170.  
  171. gb2dos(hi, lo, hi1, lo1)
  172.      int hi, lo, *hi1, *lo1;
  173. {
  174.   *hi1 = 0x80 + hi;
  175.   *lo1 = 0x80 + lo;
  176. }
  177.